package com.qkjia.springcloud.hystrixservice.controller;

import cn.hutool.core.thread.ThreadUtil;
import com.qkjia.springcloud.hystrixservice.pojo.Result;
import com.qkjia.springcloud.hystrixservice.pojo.User;
import com.qkjia.springcloud.hystrixservice.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;

/**
 * Description:
 *
 * @author JourWon
 * @date 2019/12/18 16:52
 * 创建UserHystrixController接口用于调用user-service服务
 * 此处省略了创建用户类User和统一返回前端的响应类Result，RestTemplate配置，
 * UserService接口的创建，具体的可以参考项目源码
 */
@RestController//controller + @ResponseBody注解。
@RequestMapping("/user")
public class UserHystrixController {

    @Autowired
    private UserService userService;

    //1 测试服务降级的接口
    //在UserService中添加调用方法与服务降级方法，方法上需要添加@HystrixCommand注解：
    @GetMapping("/testFallback/{id}")
    //    @ApiOperationSupport(author = "zqk", order = 1)
    public Result testFallback(@PathVariable Long id) {

        return userService.getUser(id);
    }



    //3  使用ignoreExceptions忽略某些异常降级
    @GetMapping("/testException/{id}")
    public Result testException(@PathVariable Long id) {
        return userService.getUserException(id);
    }

    //  2  设置命令、分组及线程池名称
    //    在UserHystrixController中添加测试接口：
    @GetMapping("/testCommand/{id}")
    public Result getUserCommand(@PathVariable Long id) {
        return userService.getUserCommand(id);
    }

    //4    测试使用缓存
    //    在UserHystrixController中添加使用缓存的测试接口，直接调用三次getUserCache方法：
   @GetMapping("/testCache/{id}")
    public Result testCache(@PathVariable Long id) {
        userService.getUserCache(id);
        //报错 是没有初始化，写一个过滤器就好了
        userService.getUserCache(id);
        userService.getUserCache(id);
        return new Result("操作成功", 200);
    }

    // 5   测试移除缓存  :http://localhost:8401/user/testRemoveCache/1
    //    在UserHystrixController中添加移除缓存的测试接口，调用一次removeCache方法：
    @GetMapping("/testRemoveCache/{id}")
    public Result testRemoveCache(@PathVariable Long id) {
        userService.getUserCache(id);
        userService.removeCache(id);
        userService.getUserCache(id);
        return new Result("操作成功", 200);
    }


    //6请求合并
    // ------------注意：测试之前需要重启user-service服务，因为刚才测试请求缓存把数据删了一个，不然会报错
    //在UserHystrixController中添加testCollapser方法，这里我们先进行两次服务调用，再间隔200ms以后进行第三次服务调用
    @GetMapping("/testCollapser")
    public Result testCollapser() throws ExecutionException, InterruptedException {
        Future<User> future1 = userService.getUserFuture(1L);
        Future<User> future2 = userService.getUserFuture(2L);
        future1.get();
        future2.get();
        ThreadUtil.safeSleep(200);
        Future<User> future3 = userService.getUserFuture(3L);
        future3.get();
        return new Result("操作成功", 200);
    }


}
